#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<map>
#include<string>

using namespace std;

int main()
{
	int m, n, t;
	int i, j, v;
	map<pair<int,int>, int> map;
	cin >> m >> n >> t;
	while (t--)
	{
		cin >> i >> j >> v;
		pair<int, int> t = { j,i };
		map[t] = v;
	}
	auto it = map.begin();
	while (it != map.end())
	{
		cout << (*it).first.first << " " << (*it).first.second << " " << (*it).second << endl;
		it++;
	}

	return 0;
}


//#include<iostream>
//#include<map>
//#include<string>
//#include<vector>
//
//using namespace std;
//
//int main()
//{
//	int m, n, t1, t2;
//	int i, j, v;
//	int cnt = 0;
//	map<string, int> _map;
//	map<string, int> pos;
//	vector<string> end;
//	cin >> m >> n >> t1;
//	t2 = t1;
//	while (t1--)
//	{
//		cin >> i >> j >> v;
//		string t = to_string(j) + " " + to_string(i) + " ";
//		string tmp = to_string(i) + " " + to_string(j) + " ";
//		end.push_back(tmp);
//		_map[t] = v;
//	}
//	auto it = _map.begin();
//	while (it != _map.end())
//	{
//		pos[(*it).first] = cnt;
//		cnt++;
//		it++;
//	}
//	int p = 0;
//	while(t2--)
//	{
//		string t = end[p++];
//		int k = t.find(" ");
//		string check = t.substr(k+1, t.size()) + t.substr(0, k)+" ";
//		cout << pos[check] << " " << check << _map[check] << endl;
//	}
//
//	return 0;
//}




//#include <iostream>
//#include <string>
//#include <map>
//
//using namespace std;
//
//int main()
//{
//	map<string, int> check;
//	string s;
//	int ret = 0;
//	cin >> s;
//	int n = s.size();
//	for (int i = 0; i < n; i++)
//	{
//		for (int j = 0; j < i; j++)
//		{
//			string t = string(s.begin() + j, s.begin() + 1 + i);
//			check[t] += 1;
//			if (check[t] >= 2)
//			{
//				if (ret < t.size())
//					ret = t.size();
//			}
//		}
//	}
//	cout << ret;
//
//	return 0;
//}



//#include <iostream>
//#include <cstring>
//#include <map>
//using namespace std;
//
//const int N = 10010, mod = 1e9, P = 100007;
//map<int, int> mp;
//string s;
//int h[N], p[N], n, ans;
//
//int query(int l, int r)
//{
//	return ((h[r] - h[l - 1] * p[r - l + 1] % mod) + mod) % mod;
//}
//
//bool judge(int x)
//{
//	mp.clear();
//	for (int i = 0; i < n - x; i++)
//	{
//		int hash = query(i + 1, i + x + 1);
//		if (mp[hash]) return 1;
//		mp[hash] = 1;
//	}
//	return 0;
//}
//
//int main()
//{
//	cin >> s;
//	n = s.size();
//
//	p[0] = 1;
//	for (int i = 0; i < n; i++)
//	{
//		p[i + 1] = p[i] * P;
//		h[i + 1] = h[i] * P + s[i];
//	}
//
//	int l = 0, r = n - 1;
//	while (l < r)
//	{
//		int mid = l + r >> 1;
//		if (judge(mid)) l = mid + 1;
//		else r = mid;
//	}
//	cout << l << endl;
//
//	return 0;
//}

//#include <iostream>
//#include <cstring>
//#include <map>
//
//using namespace std;
//
//const int N = 10010, mod = 1e9, P = 100007;
//map<int, int> mp;
//string s;
//int h[N], p[N], n, ans;
//
//int query(int l, int r)
//{
//	return ((h[r] - h[l - 1] * p[r - l + 1] % mod) + mod) % mod;
//}
//
//bool judge(int x)
//{
//	mp.clear();
//	for (int i = 0; i < n - x; i++)
//	{
//		int hash = query(i + 1, i + x + 1);
//		if (mp[hash]) return 1;
//		mp[hash] = 1;
//	}
//	return 0;
//}
//
//int main()
//{
//	cin >> s;
//	n = s.size();
//
//	p[0] = 1;
//	for (int i = 0; i < n; i++)
//	{
//		p[i + 1] = p[i] * P;
//		h[i + 1] = h[i] * P + s[i];
//	}
//
//	int l = 0, r = n - 1;
//	while (l < r)
//	{
//		int mid = l + r >> 1;
//		if (judge(mid)) l = mid + 1;
//		else r = mid;
//	}
//	cout << l << endl;
//
//	return 0;
//}